#include <brpc/channel.h>
#include<memory>
#include<thread>
#include "main.pb.h"

void callback(brpc::Controller *cntl,
              ::example::EchoResponse *response)
{
    std::cout << "收到响应# " << response->message() << std::endl; // 这里为同步！！！
}
int main(int argc, char *argv[])
{
    // 构造信道
    auto channel = std::make_shared<brpc::Channel>();
    auto options = std::make_shared<brpc::ChannelOptions>();
    options->timeout_ms = -1; // 连接空闲超时时间
    options->connect_timeout_ms = -1;
    options->max_retry = 3;
    options->protocol = "baidu_std"; // 序列化协议为baidu_std
    // 连接服务器
    int ret = channel->Init("127.0.0.1:8888", options.get());
    if (ret == -1)
    {
        std::cout << "信道初始化失败" << std::endl;
        return -1;
    }
    // EchoService服务存根
    auto stub = std::make_shared<example::EchoService_Stub>(channel.get());
    // 进行rpc调用
    auto req = std::make_shared<example::EchoRequest>();
    req->set_message("this is a test");
    auto resp = std::make_shared<example::EchoResponse>();
    // 获取一个rpc操作对象
    auto cntl = std::make_shared<brpc::Controller>();     // ??
    if (cntl->Failed() == true)
    {
        std::cout << "rpc调用失败，原因：" << cntl->ErrorText() << std::endl;
        return -1;
    }
    // // 同步
    // {
    //     stub->Echo(cntl.get(), req.get(), resp.get(), nullptr); // 第四个参数为异步处理对象，获取异步结果？
    //     // 通过stub服务存根获取到响应
    //     std::cout << "收到响应# " << resp->message() << std::endl; // 这里为同步！！！
    // }

    // 改为异步
    {
        auto clusure = google::protobuf::NewCallback(callback, cntl.get(), resp.get());
        stub->Echo(cntl.get(), req.get(), resp.get(), clusure);
    }
    std::this_thread::sleep_for(std::chrono::seconds(5));
}

